home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 23 / AACD 23.iso / AACD / Programming / tek / task / allocsignal.c next >
Encoding:
C/C++ Source or Header  |  2001-05-12  |  981 b   |  59 lines

  1.  
  2. #include "tek/exec.h"
  3. #include "tek/kn/exec.h"
  4.  
  5. /* 
  6. **    TEKlib
  7. **    (C) 2001 TEK neoscientists
  8. **    all rights reserved.
  9. **
  10. **    TUINT TAllocSignal(TAPTR task, TUINT signals)
  11. **
  12. **    alloc task signal(s).
  13. **
  14. */
  15.  
  16. TUINT TAllocSignal(TAPTR task, TUINT signals)
  17. {
  18.     TUINT newsignal = 0;
  19.  
  20.     if (task)
  21.     {
  22.         kn_lock(&((TTASK *) task)->siglock);
  23.  
  24.         if (signals)
  25.         {
  26.             if ((signals & ((TTASK *) task)->sigfree) == signals)
  27.             {
  28.                 newsignal = signals;
  29.             }
  30.         }
  31.         else
  32.         {
  33.             TINT x;
  34.             TUINT trysignal = 0x00000001;
  35.             
  36.             for (x = 0; x < TTASK_MAX_SIGNALS; ++x)
  37.             {
  38.                 if (!(trysignal & TTASK_SIG_RESERVED))
  39.                 {
  40.                     if (trysignal & ((TTASK *) task)->sigfree)
  41.                     {
  42.                         newsignal = trysignal;
  43.                         break;
  44.                     }
  45.                 }
  46.                 trysignal <<= 1;
  47.             }
  48.         }
  49.  
  50.         ((TTASK *) task)->sigfree &= ~newsignal;
  51.         ((TTASK *) task)->sigstate &= ~newsignal;                /* clear from current set of signals */
  52.         ((TTASK *) task)->sigused |= newsignal;
  53.  
  54.         kn_unlock(&((TTASK *) task)->siglock);
  55.     }
  56.     
  57.     return newsignal;
  58. }
  59.